package segment_word_util;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.sun.jna.Library;
import com.sun.jna.Native;



/**
 * @author YuanYuhu
 *	现在是做一个分词的工具，目前来看是运行的良好，回头再看吧
 */
public class SegmentWordsUtil {
	
	Logger logger = Logger.getLogger(SegmentWordsUtil.class.getName());
	
	/**
	 * @author YuanYuhu
	 *	实现的相关功能接口
	 */
	public interface CLibrary extends Library {
		CLibrary Instance = (CLibrary) Native.loadLibrary("NLPIR", CLibrary.class);
		public int NLPIR_Init(String sDataPath, int encoding,String sLicenceCode);
		public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
		public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);
		public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,boolean bWeightOut);
		public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
		public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
		public String NLPIR_GetLastErrorMsg();
		public void NLPIR_Exit();
	}

	public static String transString(String aidString, String ori_encoding,String new_encoding) {
		try {
			return new String(aidString.getBytes(ori_encoding), new_encoding);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 添加用户字典
	 */
	public List<String> userWords;
 	
	public SegmentWordsUtil(){
		try {
			init();
		} catch (ListNullException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public SegmentWordsUtil(List<String> userWords){
		this.userWords = userWords;
		try {
			init();
		} catch (ListNullException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:27:13 
	* @parameter 
	* @return
	* @throws
	* 完成初始化操作，主要是配置Clibrary工具和用户字典
	*/
	public void init() throws ListNullException{
		String argu = System.getProperty("user.dir");
		int charset_type = 1;
		int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
		String nativeBytes = null;
		if (0 == init_flag) {
			nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
			logger.info("初始化失败！fail reason is "+nativeBytes);
		}
		if(userWords != null){
			for(String word : userWords){
				CLibrary.Instance.NLPIR_AddUserWord(word);
			}
		}
	}
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:27:41 
	* @parameter 
	* @return
	* @throws
	* 对list进行分词
	*/
	public List<String> segmentSentences(List<String> sentences){
		List<String> results = new ArrayList<>();
		for(String sInput : sentences){
			results.add(segmentSentence(sInput));
		}
		CLibrary.Instance.NLPIR_Exit();
		return results;
	}
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:27:50 
	* @parameter 
	* @return
	* @throws
	* 对单个句子进行分词
	*/
	public String segmentSentence(String sInput){
		return CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
	}
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:28:05 
	* @parameter 
	* @return
	* @throws
	* 是否做规范化处理
	*/
	public String segmentSentence(String sInput, boolean flag){
		String tempString = segmentSentence(sInput);
		if(flag){
			return tempString.replaceAll("/[a-zA-Z0-9]+", "");
		}else{
			return tempString;
		}
	}
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:28:27 
	* @parameter 
	* @return
	* @throws
	* 关闭CLibrary实例
	*/
	public void closeCLibrary(){
		CLibrary.Instance.NLPIR_Exit();
	}
	
	
	
	/** 
	* @author  作者 : YUHU YUAN
	* @date 创建时间：2016年12月30日 上午10:28:50 
	* @parameter 
	* @return
	* @throws
	* 功能测试
	*/
	public void test(String sentenceContent,List<String> symptoms){
		String argu = System.getProperty("user.dir");
		int charset_type = 1;
		int init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");
		String nativeBytes = null;
		if (0 == init_flag) {
			nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
			logger.info("初始化失败！fail reason is "+nativeBytes);
		}
		try {
			for(String symptom_Name : symptoms){
				CLibrary.Instance.NLPIR_AddUserWord(symptom_Name);
			}
			String sInput = sentenceContent;
			
			nativeBytes = CLibrary.Instance.NLPIR_ParagraphProcess(sInput, 1);
			
			Logger.getLogger("SegmentWordsUtil").info("增加用户词典后分词结果为:" + nativeBytes);
			
			CLibrary.Instance.NLPIR_Exit();
		} catch (Exception ex) {
			// TODO Auto-generated catch block
			ex.printStackTrace();
		}
		
	}

	public static void main(String[] args){
		
		List<String> list = new ArrayList<>();
		list.add("口干");
		list.add("舌燥");
		
		SegmentWordsUtil segmentWordsUtil = new SegmentWordsUtil(list);
		System.out.println(segmentWordsUtil.segmentSentence("间断性口干舌燥三天。", true));
		segmentWordsUtil.closeCLibrary();
		
	}
	
	
	
	
	
	
	
	
	
	
	
	
}





